package com.w7vm.menuweb.facade;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.PersistenceContext;

import com.w7vm.menuweb.dao.RestauranteDAO;
import com.w7vm.menuweb.dao.RestauranteSedeInfraestruturaDAO;
import com.w7vm.menuweb.entity.RestauranteCulinariaSy;
import com.w7vm.menuweb.entity.RestauranteEstruturaSy;
import com.w7vm.menuweb.entity.RestauranteFilialInfraestruturaWeb;
import com.w7vm.menuweb.entity.RestauranteSedeEnderecoWeb;
import com.w7vm.menuweb.entity.RestauranteSedeInfraestruturaWeb;
import com.w7vm.menuweb.entity.RestauranteSedeJuridicoWeb;
import com.w7vm.menuweb.entity.RestauranteSedeWeb;
import com.w7vm.menuweb.entity.RestauranteServicoSy;
import com.w7vm.menuweb.entity.RestauranteTipoSy;
import com.w7vm.menuweb.utility.ConstantesEJB;
import com.w7vm.menuweb.vo.EnderecoVO;
import com.w7vm.menuweb.vo.RestauranteVO;

@Stateless(name="restauranteEJB")
@Remote(RestauranteSedeFacade.class)

public class RestauranteSedeFacadeImp implements RestauranteSedeFacade {

	@EJB
	private RestauranteDAO restauranteDAO; 
	@EJB
	private RestauranteSedeInfraestruturaDAO sedeinfraDAO; 
	
	private RestauranteSedeEnderecoWeb sedeEnderecoEntity = new RestauranteSedeEnderecoWeb();
	private RestauranteSedeInfraestruturaWeb sedeInfraEntity = new RestauranteSedeInfraestruturaWeb(); 
	private RestauranteEstruturaSy restEstSYS = new RestauranteEstruturaSy(); 
	private RestauranteTipoSy tipoEntity = new RestauranteTipoSy();
	private RestauranteServicoSy servicoEntity = new RestauranteServicoSy();
	private RestauranteCulinariaSy culinariaEntity = new RestauranteCulinariaSy();
	ConstantesEJB constObj = new ConstantesEJB();
	
	private RestauranteVO restauranteVO = new RestauranteVO(); 
	private EnderecoVO enderecoVO = new EnderecoVO(); 
	
	
	
	
//======================== OPERACAO CRUD =======================================================

	@Override
	public void saveRestauranteSede(RestauranteSedeWeb rest) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void deleteRestauranteSede(RestauranteSedeInfraestruturaWeb infraOjb){
		sedeinfraDAO.deleteInfraestrutura(infraOjb);
		
	}
	
	@Override
	public void deleteRestauranteSedeInfraestrutura(RestauranteSedeWeb infraOjb){
		restauranteDAO.deleteInfraestrutura(infraOjb);
		
	}
	
	
	@Override
	public RestauranteSedeWeb findRestauranteSedeByID(int idRestaurante) {
		return restauranteDAO.findRestauranteSedeByID(idRestaurante);
	}

	@Override
	public RestauranteSedeWeb updateRestauranteSede(RestauranteSedeWeb sedeEntity) {
		return restauranteDAO.mergeUpdate(sedeEntity);
	}

	@Override
	public 	List<RestauranteSedeWeb> findRestauranteSedeByCNPJ(String cnpj) {
		System.out.println("[findRestauranteSedeByCNPJ] "+ cnpj);
		return restauranteDAO.findRestauranteSedeByCNPJ(cnpj);
	}

	
//========================== OPERACAO SET VIEW OBJECT - VO =========================================================
	 /*
	 * Metodo: setRestauranteSedeVO()
	 * 
	 * Tipo: ENTITY - View Object
	 * 
	 * Funcionalidade: utilizado no momento da abertura da tela, para carregar dados no ViewObject
	 *  
	 * */
	public RestauranteVO setRestauranteSedeVO(RestauranteSedeWeb sedeEntity){
		
		// RestauranteSede
		restauranteVO.setIdRestaurante(sedeEntity.getIdRestauranteSedeWeb());
		restauranteVO.setProprietario(sedeEntity.getProprietario());
		if(sedeEntity.getStatus() == constObj.ATIVO){
			restauranteVO.setStatus(constObj.ATIVOs);
		} else if(sedeEntity.getStatus() == constObj.INATIVO){
			restauranteVO.setStatus(constObj.INATIVOs);
		}
		restauranteVO.setFone1(sedeEntity.getFone1());
		restauranteVO.setFone2(sedeEntity.getFone2());
		restauranteVO.setMail(sedeEntity.getMail());
		restauranteVO.setDataInc(sedeEntity.getDataInc());
		
		// RestauranteSede - Juridico
		restauranteVO.setCnpj(sedeEntity.getRestauranteSedeJuridicoWeb().getCnpj());
		restauranteVO.setInsEstadual(sedeEntity.getRestauranteSedeJuridicoWeb().getInsEstadual());
		restauranteVO.setRzSocial(sedeEntity.getRestauranteSedeJuridicoWeb().getRzSocial());
		restauranteVO.setNomeFantasia(sedeEntity.getRestauranteSedeJuridicoWeb().getNomeFantasia());
		
		// RestauranteSede - Tipo
		restauranteVO.setIdTipoRestaurante(sedeEntity.getRestauranteTipoSy().getIdRestauranteTipoSys());
		restauranteVO.setNomeTipo(sedeEntity.getRestauranteTipoSy().getTipo());

		// RestauranteSede - Culinaria
		restauranteVO.setIdCulinariaRestaurante(sedeEntity.getRestauranteCulinariaSy().getIdRestauranteCulinariaSys());
		restauranteVO.setNomeCulinaria(sedeEntity.getRestauranteCulinariaSy().getCulinaria());

		// RestauranteSede - Servico
		restauranteVO.setIdServicoRestaurante(sedeEntity.getRestauranteServicoSy().getIdRestauranteServicoSys());
		restauranteVO.setNomeServico(sedeEntity.getRestauranteServicoSy().getServico());
		return restauranteVO;
	}

	@Override
	public Set<RestauranteEstruturaSy> setRestauranteSedeEstruturaVO(RestauranteSedeWeb sedeEntity) {
		
		Set<RestauranteEstruturaSy> estruturaSysL = new HashSet<RestauranteEstruturaSy>();
		
		// RestauranteSede - Infraestrutura
		for(RestauranteSedeInfraestruturaWeb infObj: sedeEntity.getRestauranteSedeInfraestruturaWebs()){
			restEstSYS = new RestauranteEstruturaSy();
			restEstSYS.setIdRestauranteEstruturaSys(infObj.getRestauranteEstruturaSy().getIdRestauranteEstruturaSys());
			restEstSYS.setEstrutura(infObj.getRestauranteEstruturaSy().getEstrutura());
			estruturaSysL.add(restEstSYS);	
		}
		return estruturaSysL;
	}

	@Override
	public EnderecoVO setRestauranteSedeEnderecoVO(RestauranteSedeWeb sedeEntity) {
		// RestauranteSede - Endereco
		for(RestauranteSedeEnderecoWeb endObj: sedeEntity.getRestauranteSedeEnderecoWebs()){
			enderecoVO.setIdEndereco(endObj.getIdRestauranteSedeEnderecoWeb());
			enderecoVO.setLogradouro(endObj.getLogradouro());
			enderecoVO.setBairro(endObj.getBairro());
			enderecoVO.setNumero(endObj.getNumero());
			enderecoVO.setCep(endObj.getCep());
			enderecoVO.setEstado(endObj.getEstado());
			enderecoVO.setCidade(endObj.getCidade());
		}
		return enderecoVO;
	}
	
	//========================== OPERACAO SET ENTITY =========================================================

	/*
	* Metodo: setRestauranteSedeEntity()
	* 
	* Tipo: View Object - ENTITY
	* 
	* Funcionalidade: utilizado no momento da persistencia dos dados na table carrega dados para ENTITIY
	*  
	* */
	
	public RestauranteSedeWeb setRestauranteSedeEntity(RestauranteVO restauranteVO, 
			RestauranteSedeWeb sedeEntity)
	{
		// RestauranteSede
		sedeEntity.setIdRestauranteSedeWeb(restauranteVO.getIdRestaurante());
		sedeEntity.setProprietario(restauranteVO.getProprietario());
		sedeEntity.setStatus(constObj.ATIVO);
		sedeEntity.setFone1(restauranteVO.getFone1());
		sedeEntity.setFone2(restauranteVO.getFone2());
		sedeEntity.setMail(restauranteVO.getMail());
		sedeEntity.setDataInc(restauranteVO.getDataInc());
		Date dtnow = new Date();
		sedeEntity.setDtAlt(dtnow);
		
		// RestauranteSede - Tipo
		tipoEntity.setIdRestauranteTipoSys(restauranteVO.getIdTipoRestaurante());
		sedeEntity.setRestauranteTipoSy(tipoEntity);
		
		// RestauranteSede - Culinaria
		culinariaEntity.setIdRestauranteCulinariaSys(restauranteVO.getIdCulinariaRestaurante());
		sedeEntity.setRestauranteCulinariaSy(culinariaEntity);
		
		// RestauranteSede - Servico
		servicoEntity.setIdRestauranteServicoSys(restauranteVO.getIdServicoRestaurante());
		sedeEntity.setRestauranteServicoSy(servicoEntity);
		
		sedeEntity.getRestauranteSedeJuridicoWeb().setCnpj(restauranteVO.getCnpj());
		sedeEntity.getRestauranteSedeJuridicoWeb().setInsEstadual(restauranteVO.getInsEstadual());
		sedeEntity.getRestauranteSedeJuridicoWeb().setRzSocial(restauranteVO.getRzSocial());
		sedeEntity.getRestauranteSedeJuridicoWeb().setNomeFantasia(restauranteVO.getNomeFantasia());
		
		
		return sedeEntity;
		
	}
	public RestauranteSedeEnderecoWeb setRestauranteSedeEnderecoEntity(EnderecoVO enderecoVO){
		sedeEnderecoEntity.setIdRestauranteSedeEnderecoWeb(enderecoVO.getIdEndereco());
		sedeEnderecoEntity.setLogradouro(enderecoVO.getLogradouro());
		sedeEnderecoEntity.setBairro(enderecoVO.getBairro());
		sedeEnderecoEntity.setNumero(enderecoVO.getNumero());
		sedeEnderecoEntity.setCep(enderecoVO.getCep());
		sedeEnderecoEntity.setEstado(enderecoVO.getEstado());
		sedeEnderecoEntity.setCidade(enderecoVO.getCidade());
		
		return sedeEnderecoEntity;
	}
	
	public Set<RestauranteSedeInfraestruturaWeb> setRestauranteSedeInfraestruturaEntity(List<RestauranteEstruturaSy> estruturaPickerView,
			RestauranteSedeWeb restObj){
		Set<RestauranteSedeInfraestruturaWeb> infraSedeL = new HashSet<RestauranteSedeInfraestruturaWeb>();

		for(RestauranteEstruturaSy estrutura : estruturaPickerView){
			System.out.println("ID RestauranteEstruturaSys "+ estrutura.getIdRestauranteEstruturaSys());
			restEstSYS.setIdRestauranteEstruturaSys(estrutura.getIdRestauranteEstruturaSys());
			sedeInfraEntity.setRestauranteEstruturaSy(restEstSYS);
			
			System.out.println("ID ESTRUTURA ====== "+ sedeInfraEntity.getRestauranteEstruturaSy().getIdRestauranteEstruturaSys());

			sedeInfraEntity.setRestauranteSedeWeb(restObj);
			infraSedeL.add(sedeInfraEntity);
			restEstSYS = new RestauranteEstruturaSy();
			sedeInfraEntity = new RestauranteSedeInfraestruturaWeb();
		}
		System.out.println("Tamanho EStrutura Sede  "+ infraSedeL.size());
		return infraSedeL;
	}

}
